/**
 * 构造长度小于等于K的字符串，第i种字母的数量在[0, Ci]之间，
 * 问方案总数
 * 
 * 令Dij表示前i类字母长度为j的方案总数，则
 * Dij = SIGMA{D[i-1][j-k]*C(j,k),k从0到min(j,Ci)}
 * 其中D[i-1][j-k]表示前i-1个字母长度为j-k的方案总数，则在此基础上再添加k个字母i即可
 * 这k个字母显然是一样的，然后有j-k+1个不同的位置可放，因此相当于将k个同球放到j-k+1个异盒中且可空的方案
 * 所以是 C(j, j-k)
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

template<typename T>
istream & operator >> (istream & is, vector<T> & vec) {
    for(auto & i : vec) is >> i;
    return is;
}

template<typename T>
void input(vector<T> & vec, int n){
    vec.assign(n + 1, {});
    for(int i=1;i<=n;++i) cin >> vec[i];
    return;
}


int const SZ = 10000010;
llt const MOD = 998244353LL;

llt qpow(llt a, llt n){
    llt ret = 1;
    a %= n;
    while(n){
        if(n & 1) ret = ret * a % MOD;
        a = a * a % MOD;
        n >>= 1;
    }
    return ret;
}

inline llt inv(llt x){return qpow(x, MOD-2LL);}

vector<llt> Fac, IFac;

inline llt C(llt n, llt m){
    if(0 <= m and m <= n) return Fac[n] * IFac[n - m] % MOD * IFac[m] % MOD;
    return 0;
}



int N;
array<int, 26> Limit;
vector<vector<llt>> D;


void work(){
    cin >> N;
    for(auto & i : Limit) cin >> i;

    D.assign(27, vector<llt>(N + 1, 0LL));
    D[0][0] = 1;
    for(int i=1;i<=26;++i){       
        D[i][0] = 1;
        auto limit = Limit[i - 1];
        auto & pre = D[i - 1];
        // copy(pre.begin(), pre.end(), D[i].begin());
        for(int j=1;j<=N;++j){
            auto & d = D[i][j];
            for(int k=0;k<=limit&&k<=j;++k){
                d = (d + pre[j - k] * C(j, k) % MOD) % MOD;
            }
        }
    }

#ifndef ONLINE_JUDGE
    // for(int i=1;i<=26;++i){
    //     for(int j=1;j<=N;++j){
    //         cout << i << ", " << j << ": " << D[i][j] << endl;
    //     }
    // }
#endif

    llt sum = 0;
    for(int i=1;i<=N;++i){
        sum = (sum + D[26][i]) % MOD;
    }
    cout << sum << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    Fac.assign(SZ, 0);
    IFac.assign(SZ, 0);
    Fac[0] = Fac[1] = 1;
    for(int i=1;i<SZ;++i) Fac[i] = Fac[i - 1] * i % MOD;
    IFac[SZ - 1] = inv(Fac[SZ - 1]);
    for(int i=SZ-2;i>=0;--i) IFac[i] = IFac[i + 1] * (i + 1) % MOD;
    assert(IFac[0] == 1 and IFac[1] == 1);
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}
